module history_defaults
!----------------------------------------------------------------------- 
! 
! Purpose: contains calls to setup defualt history stuff that has not found
!          a proper home yet. Shouldn't really exist.
!
! Public functions/subroutines:
!   bldfld
! 
! Author: B.A. Boville from code in cam_history.F90
!-----------------------------------------------------------------------
  use shr_kind_mod, only: r8 => shr_kind_r8, r4 => shr_kind_r4
  use constituents, only: pcnst, cnst_name
  use ppgrid,       only: pver, pverp
  use pmgrid,       only: plev, plevp
  use dycore,       only: dycore_is

  use cam_history,  only: phys_decomp, dyn_decomp, addfld, add_default
  implicit none

  PRIVATE

  public :: bldfld

#if ( defined BFB_CAM_SCAM_IOP )
  public :: initialize_iop_history
#endif

CONTAINS


!#######################################################################
  subroutine bldfld ()
!
!----------------------------------------------------------------------- 
! 
! Purpose: 
!
! Build Master Field List of all possible fields in a history file.  Each field has 
! associated with it a "long_name" netcdf attribute that describes what the field is, 
! and a "units" attribute.
! 
! Method: Call a subroutine to add each field
! 
! Author: CCM Core Group
! 
!-----------------------------------------------------------------------
!
! Local workspace
!
    integer m                     ! Index

!
! Call addfld to add each field to the Master Field List.
!
    call addfld ('SGH     ','m       ',1,    'I','Standard deviation of orography',phys_decomp)
    call addfld ('SGH30   ','m       ',1,    'I','Standard deviation of 30s orography',phys_decomp)


!jt
!jt Maybe add this to scam specific initialization
!jt

#if ( defined BFB_CAM_SCAM_IOP )
    call addfld ('CLAT1&IC','none      ',1,    'I','cos lat for bfb testing', dyn_decomp)
    call add_default ('CLAT1&IC       ',0, 'I')
    call addfld ('CLON1&IC','none      ',1,    'I','cos lon for bfb testing', dyn_decomp)
    call add_default ('CLON1&IC       ',0, 'I')
    call addfld ('PHI&IC','none      ',1,    'I','lat for bfb testing', dyn_decomp)
    call add_default ('PHI&IC       ',0, 'I')
    call addfld ('LAM&IC','none      ',1,    'I','lon for bfb testing', dyn_decomp)
    call add_default ('LAM&IC       ',0, 'I')
#endif

    call addfld ('DQP     ','kg/kg/s ',pver, 'A','Specific humidity tendency due to precipitation',phys_decomp)

  end subroutine bldfld

!#######################################################################
#if ( defined BFB_CAM_SCAM_IOP  )
  subroutine initialize_iop_history()
!
! !DESCRIPTION: 
! !USES:
    use iop
    use ppgrid, only: pver, pverp
    use phys_control,     only: phys_getopts
! !ARGUMENTS:
    implicit none
!
! !CALLED FROM:
!
! !REVISION HISTORY:
!
!EOP
!
! !LOCAL VARIABLES:
    integer m
    character(len=16) :: microp_scheme  ! microphysics scheme
!-----------------------------------------------------------------------
    call addfld ('CLAT ','none      ',1,    'A','cos lat for bfb testing', dyn_decomp)
    call add_default ('CLAT',2,' ')
    call addfld ('q','kg/kg   ',plev, 'A','Q for scam',dyn_decomp)
    call add_default ('q',2, ' ')
    call addfld ('u','m/s     ',plev, 'A','U for scam',dyn_decomp)
    call add_default ('u',2,' ')
    call addfld ('v','m/s     ',plev, 'A','V for scam',dyn_decomp)
    call add_default ('v',2,' ')
    call addfld ('t','K       ',plev, 'A','Temperature for scam',dyn_decomp)
    call add_default ('t',2,' ')
    call addfld ('Tg','K      ',1,    'A','Surface temperature (radiative) for scam',phys_decomp)
    call add_default ('Tg',2,' ')
    call addfld ('Ps','Pa      ',1, 'A','Ps for scam',dyn_decomp)
    call add_default ('Ps',2,' ')
    call addfld ('divT3d','K       ',plev, 'A','Dynamics Residual for T',dyn_decomp)
    call add_default ('divT3d',2,' ')
    call addfld ('fixmas','percent',1, 'A','Mass fixer',dyn_decomp)
    call add_default ('fixmas',2,' ')
    call addfld ('beta','percent  ',1, 'A','Mass fixer',dyn_decomp)
    call add_default ('beta',2,' ')
    do m=1,pcnst
       call addfld (trim(cnst_name(m))//'_dten','kg/kg   ',plev, 'A',trim(cnst_name(m))//' IOP Dynamics Residual for '//trim(cnst_name(m)),dyn_decomp)
       call add_default (trim(cnst_name(m))//'_dten',2,' ')
       call addfld (trim(cnst_name(m))//'_alph','kg/kg   ',1, 'A',trim(cnst_name(m))//' alpha constituent fixer',dyn_decomp)
       call add_default (trim(cnst_name(m))//'_alph',2,' ')
       call addfld (trim(cnst_name(m))//'_dqfx','kg/kg   ',plev, 'A',trim(cnst_name(m))//' dqfx3 fixer',dyn_decomp)
       call add_default (trim(cnst_name(m))//'_dqfx',2,' ')
    end do
    call addfld ('shflx ','W/m2    ',1,    'A','Surface sensible heat flux for scam',phys_decomp)
    call add_default ('shflx ',2,' ')
    call addfld ('lhflx   ','W/m2    ',1,    'A','Surface latent heat flux for scam',phys_decomp)
    call add_default ('lhflx   ',2,' ')
    call addfld ('trefht  ','K       ',1,    'A','Reference height temperature',phys_decomp)
    call add_default ('trefht  ',2,' ')
    call addfld ('Tsair  ','K       ',1,    'A','Reference height temperature for scam',phys_decomp)
    call add_default ('Tsair  ',2,' ')
    call addfld ('phis   ','m2/s2   ',1,    'I','Surface geopotential for scam',phys_decomp)
    call add_default ('phis   ',2,' ')
    call addfld ('Prec   ','m/s     ',1,    'A','Total (convective and large-scale) precipitation rate for scam',phys_decomp)
    call add_default ('Prec   ',2,' ')
    call addfld ('omega   ','Pa/s    ',pver, 'A','Vertical velocity (pressure)',phys_decomp)
    call add_default ('omega   ',2,' ')

  end subroutine initialize_iop_history
#endif

end module history_defaults
